package donnees;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;

public class FabriqueLigneCommande {

	public static FabriqueLigneCommande fc = null;
	private Map<Integer, LigneCommande> cache;
	Connection dbCon;
	PreparedStatement creer;
	PreparedStatement rechercherLigneCommande;
	PreparedStatement recupererDernierID;

	public static FabriqueLigneCommande getInstance() throws SQLException {
		if (fc == null) {
			fc = new FabriqueLigneCommande();
		}
		return fc;
	}

	private FabriqueLigneCommande() throws SQLException {
		this.cache = new HashMap<Integer, LigneCommande>();
		this.initConnection();
	}

	private void initConnection() throws SQLException {
		this.dbCon = DB.getInstance().getConnection();
		this.creer = dbCon
				.prepareStatement("INSERT INTO LigneCommande(idlignecommande, idcommande,idproduit,quantite) VALUES((NEXT VALUE FOR client_seq),?,?,?)");
		this.rechercherLigneCommande = dbCon
				.prepareStatement("SELECT idLignecommande,idcommande,idproduit,quantite cp FROM LigneCommande WHERE idLigneCommande=?");
		
				
		// IDENTITY uniquement pour des colonnes identity et non les sequence
		// Pas non plus de fonction pour récupérer dernière valeur d'une sqce dans hsqldb ...
		//this.recupererDernierID = dbCon.prepareStatement("CALL IDENTITY()");
		
		this.recupererDernierID = dbCon.prepareStatement("SELECT max(idlignecommande) FROM LigneCommande");
	}

	// creer
	public LigneCommande creer(int idcommande,
			int idproduit, int quantite) throws SQLException {
		// tester les données
		boolean flag = true;
		if (quantite < 0)
			flag = false;

		// insérer le nouveau LigneCommande
		if (flag) {
			creer.clearParameters();
			creer.setInt(1, idcommande);
			creer.setInt(2, idproduit);
			creer.setInt(3, quantite);

			creer.executeUpdate();
			
			ResultSet retour=recupererDernierID.executeQuery();
			retour.next();
			
			// créer un objet LigneCommande à retourner
			LigneCommande leLigneCommande = new LigneCommande(retour.getInt(1),
					idcommande, idproduit, quantite);
			cache.put(retour.getInt(1), leLigneCommande);
			return leLigneCommande;
		} else {
			return null;
		}

	}

	// rechercher
	public LigneCommande rechercher(Integer idLigneCommande)
			throws SQLException {
		if (cache.containsKey(idLigneCommande)) {
			return cache.get(idLigneCommande);
		} else {
			rechercherLigneCommande.clearParameters();
			rechercherLigneCommande.setInt(1, idLigneCommande);
			ResultSet retour = rechercherLigneCommande.executeQuery();
			if (retour.next()) {
				LigneCommande laLigneCommande = new LigneCommande(
						idLigneCommande, retour.getInt(2), retour.getInt(3),
						retour.getInt(4));
				cache.put(idLigneCommande, laLigneCommande);
				return laLigneCommande;
			}
			return null;
		}
	}

	// viderCache
	public void flushCache() {
		this.cache.clear();
	}

}
